#include<t_stdio.h>
#include<sys/types.h>          
#include <sys/socket.h>
#include<arpa/inet.h>
#include <sys/socket.h>
#include<ctype.h>
#include<unistd.h>
int main(void){
    struct sockaddr_in serv,cli;
    socklen_t cli_len;
    char buf[128];
    char IP[32];
    //创建一个通讯端点，返回该端点的文件描述符
    //创建一个ipv4的tcp连接端口
    int s_fd=socket( AF_INET ,SOCK_STREAM ,0);

    //需要对server变量成员初始化
    serv.sin_family=AF_INET;
    serv.sin_port=htons(5556);
    serv.sin_addr.s_addr=htonl(INADDR_ANY);
    //将s_fd和本地地址，端口号绑定
    int b=bind(s_fd,(struct sockaddr *)&serv,sizeof(serv));

    if(b==-1)E_MSG("bind",-1);
    if(s_fd==-1)E_MSG("socket",-1);
    //将s_fd设置为被动连接，监听客户端连接的到来 
    //将客户端到来的连接放入未决连接队列中
    //指定未决连接队列的长度
    listen(s_fd,5);
    while(1){
        //从s_fd设备的未连接队列中提取一个进程进行处理
        //返回一个连接描述符，使用这个连接描述符与客户端进行通讯
        int c_fd=accept(s_fd,(struct sockaddr *)&cli,&cli_len);
        if(c_fd==-1)E_MSG("accept",-1);
        //binary--->text
        inet_ntop(AF_INET,&cli.sin_addr,IP,32); 
        printf("client ip: %s\n",IP);
        //代码执行到这里，三次握手以及完成，可以进行数据传输了
        //从c_fd中读取客户端发送过来的请求信息
        int r = read(c_fd,buf,128);
        //处理客户端的请求信息
        int i;
         for(i=0;i<r;i++){
            buf[i]=toupper(buf[i]);
         }
         //将处理结果回送客户端
         write(c_fd,buf,r);
        //关闭本次连接
        close(c_fd);
    }

    return 0;
}